AWS CDK で cdk rollback コマンドが利用可能になりました

AWS CDK で cdk rollback コマンドが利用可能になりました

Clock Icon2024.10.19

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の最近のリリースである v2.162.0 で、下記のアップデートが追加されていました。

https://github.com/aws/aws-cdk/releases/tag/v2.162.0

cli: cdk rollback (#31684) (3e40edc), closes #31407

端的に言うと cdk rollback コマンドが利用可能になったというものです。AWS CDK のドキュメントにもコマンドのページが追加されていました。

https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-rollback.html

用途としては、デプロイ失敗時にデバッグのためにデプロイされたリソースを保持したい場合に、cdk deploy --no-rollback コマンドによりデプロイ失敗時の自動ロールバックを停止させることが今までもできていました。この停止したロールバックを CLI で再開させることができるのが今回のコマンドになります。

試してみた

cdk rollback

次のようなデプロイが失敗するスタックを作成します。

lib/sample-app-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as iam from 'aws-cdk-lib/aws-iam';

export class SampleApp extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // IAMロールを作成
    const role = new iam.Role(this, 'Role', {
      assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
    });

    // 存在しないマネージドポリシーをアタッチしてエラーを発生させる
    role.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName('non-existent-managed-policy')
    );
  }
}

cdk deploy --no-rollback コマンドを実行して、スタックをデプロイします。

$ cdk deploy --no-rollback --require-approval never --method=direct SampleApp

✨  Synthesis time: 4.48s

SampleApp: deploying... [1/1]
SampleApp: updating stack...
9:35:01 PM | CREATE_FAILED        | AWS::IAM::Role     | Role1ABCC5F0
Resource handler returned message: "Policy arn:aws:iam::aws:policy/non-existent-managed-policy does not exist or is not attachable. (Service: Iam, Status Code: 404, Request ID: fe023d8d
-d9c7-485a-8c1c-34a13095bde0)" (RequestToken: a023c9c9-96fc-1aff-298b-a0127b87d916, HandlerErrorCode: NotFound)

❌  SampleApp failed: The stack named SampleApp failed to deploy: UPDATE_FAILED (The following resource(s) failed to create: [Role1ABCC5F0]. ): Resource handler returned message: "Policy arn:aws:iam::aws:policy/non-existent-managed-policy does not exist or is not attachable. (Service: Iam, Status Code: 404, Request ID: fe023d8d-d9c7-485a-8c1c-34a13095bde0)" (RequestToken: a023c9c9-96fc-1aff-298b-a0127b87d916, HandlerErrorCode: NotFound)

すると IAM ロールは作成されますが、マネージドポリシーのアタッチは失敗した状態でロールバックが停止します。

cdk rollback コマンドを実行して、ロールバックを実行してみます。しかし、ブートストラップリソースのバージョンが古いため、コマンド実行が失敗しました。現在は 20 ですが、23 以上である必要があります。

$ cdk rollback SampleApp

✨  Synthesis time: 7.27s

Rolling back SampleApp

 ❌  SampleApp failed: SampleApp: This CDK deployment requires bootstrap stack version '23', found '20'. Please run 'cdk bootstrap'.

Rollback failed (use --force to orphan failing resources)

ブートストラップリソースをバージョンアップします。

$ cdk bootstrap
 ⏳  Bootstrapping environment aws://XXXXXXXXXXXX/ap-northeast-1...
Trusted accounts for deployment: (none)
Trusted accounts for lookup: (none)
Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
CDKToolkit: creating CloudFormation changeset...
 ✅  Environment aws://XXXXXXXXXXXX/ap-northeast-1 bootstrapped.

23 にバージョンアップされました。

再度、cdk rollback コマンドを実行します。

$ cdk rollback SampleApp

✨  Synthesis time: 5.15s

Rolling back SampleApp

✨  Rollback time: 16.51s

ロールバックできました。

同じデプロイにより作成を試みた IAM ロールもロールバックにより削除されています。

失敗するロールバックを強制的に実行したい場合

cdk rollback によるロールバックの実行時に一部のリソースのロールバックに失敗する場合があります。その場合はオプションにより失敗するリソースを孤立させることができます。

--orphan <LogicalId> オプションを使用すると指定したリソースのロールバックをスキップし、そのリソースを孤立させることができます。

--force を使用すると、ロールバックが失敗するすべてのリソースを孤立させることができます。

おわりに

AWS CDK で cdk rollback コマンドが利用可能になったので試してみました。

ECS Service のサーキットブレーカーなど、ログを調査しないとデプロイ失敗の原因が分からない場合に、コンテナやロググループが自動ロールバックにより削除されてしまうことを防ぐために役立ちそうだと感じました。

参考

https://dev.classmethod.jp/articles/cdk-stacksets-no-rollback-option/

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.